package com.sphd.Restaurant.utils;


import com.android.volley.AuthFailureError;
import com.android.volley.NetworkError;
import com.android.volley.NetworkResponse;
import com.android.volley.NoConnectionError;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
//正如前面代码看到的，在创建一个请求时，需要添加一个错误监听onErrorResponse。如果请求发生异常，会返回一个VolleyError实例。
//以下是Volley的异常列表：
//AuthFailureError：如果在做一个HTTP的身份验证，可能会发生这个错误。
//NetworkError：Socket关闭，服务器宕机，DNS错误都会产生这个错误。
//NoConnectionError：和NetworkError类似，这个是客户端没有网络连接。
//ParseError：在使用JsonObjectRequest或JsonArrayRequest时，如果接收到的JSON是畸形，会产生异常。
//SERVERERROR：服务器的响应的一个错误，最有可能的4xx或5xx HTTP状态代码。
//TimeoutError：Socket超时，服务器太忙或网络延迟会产生这个异常。默认情况下，Volley的超时时间为2.5秒。如果得到这个错误可以使用RetryPolicy。

/**
 * Created by Hu on 2016/10/21.
 */

public class VolleyErrorHelper {

    /**
     * Returns appropriate message which is to be displayed to the user against
     * the specified error object.
     *
     * @param error
     * @param
     * @return
     */
    public static String getMessage(Object error) {
        if (error instanceof TimeoutError) {
            return "请求超时，请稍后重试~！";
        } else if (isServerProblem(error)) {
            return handleServerError(error);
        } else if (isNetworkProblem(error)) {
            return "无网络连接~！";
        }
        return "网络异常,请稍后再试~！";
    }

    /**
     * Determines whether the error is related to network
     *
     * @param error
     * @return
     */
    private static boolean isNetworkProblem(Object error) {
        return (error instanceof NetworkError)
                || (error instanceof NoConnectionError);
    }

    /**
     * Determines whether the error is related to server
     *
     * @param error
     * @return
     */
    private static boolean isServerProblem(Object error) {
        return (error instanceof ServerError)
                || (error instanceof AuthFailureError);
    }

    /**
     * Handles the server error, tries to determine whether to show a stock
     * message or to show a message retrieved from the server.
     *
     * @param err
     * @param
     * @return
     */
    private static String handleServerError(Object err) {
        VolleyError error = (VolleyError) err;

        NetworkResponse response = error.networkResponse;

        if (response != null) {
            switch (response.statusCode) {
                case 404:
                    return "404:请求的网页不存在";
                case 422:
                    return "错误码 422";
                case 401:
                    return error.getMessage();

                default:
                    return "连接服务器失败~！";
            }
        }
        return "网络异常,请稍后再试~！";
    }
}
